const date = require('./date');

//  表单验证
module.exports = (params = {}) => {
  return new Promise((resolve, reject) => {
    const {
      field,                  //  验证字段（必传）
      required,               //  是否必填
      enums,                  //  枚举检查
      isDate,                 //  日期类型检查 yyyy-mm-dd
      isDateTime,             //  日期时间类型检查 yyy-mm-dd hh:mm:ss
      isArray,                //  数组类型检查
      isNumber,               //  数值类型检查
      maxLength,              //  最大长度检查
      minLength,              //  最小长度检查
      maxValue,               //  最大值
      minValue,               //  最小值
    } = params

    //  字段类型
    const type = typeof field

    //  验证是否为空
    if(required){

      if(field === undefined || field === null){
        reject({
          err: 'required',
          field
        })
      } else if(type === 'string' && (!field || !field.trim())){
        reject({
          err: 'required_string',
          field
        })
      } else if(Array.isArray(field) && field.length === 0) {
        reject({
          err: 'required_array',
          field
        })
      }
    }

    if(field){
      //  数组格式检查
      if(isArray){
        if(!Array.isArray(field)){
          reject({
            err: 'isArray',
            field
          })
        }
      }

      //  数值格式检查
      if(isNumber){
        if(isNaN(field)){
          reject({
            err: 'isNumber',
            field
          })
        }
      }

      //  枚举检查
      if(enums){
        if(enums.indexOf(field) === -1){
          reject({
            err: 'enums',
            field
          })
        }
      }

      //  日期格式检查（yyyy-mm-dd格式）
      if(isDate){
        if(!date.isDate(field)){
          reject({
            err: 'isDate',
            field
          })
        }
      }

      //  日期时间格式检查（yyy-mm-dd hh:mm:ss格式）
      if(isDateTime){
        if(!date.isDateTime(field)){
          reject({
            err: 'isDateTime',
            field
          })
        }
      }

      //  最大值
      if(maxValue){
        if(Number(field) > maxValue){
          reject({
            err: 'maxValue',
            field
          })
        }
      }

      //  最小值
      if(minValue){
        if(Number(field) < minValue){
          reject({
            err: 'minValue',
            field
          })
        }
      }

      //  最大长度检查
      if(maxLength){
        if(type === 'string' && field.length > maxLength){
          reject({
            err: 'maxLength_string',
            field
          })
        } else if(Array.isArray(field) && field.length > maxLength){
          reject({
            err: 'maxLength_array',
            field
          })
        }
      }

      //  最小长度检查
      if(minLength){
        if(type === 'string' && field.length < minLength){
          reject({
            err: 'minLength_string',
            field
          })
        } else if(Array.isArray(field) && field.length < minLength){
          reject({
            err: 'minLength_array',
            field
          })
        }
      }
    }

    resolve(field)
  })
}